package com.qing.design.patterns.prototype.example;

import com.qing.design.patterns.prototype.example.shapes.Circle;
import com.qing.design.patterns.prototype.example.shapes.Rectangle;
import com.qing.design.patterns.prototype.example.shapes.Shape;

import java.util.ArrayList;
import java.util.List;

public class Demo {
	public static void main(String[] args) {
		// 原型是很强大的东西，因为它能在不知晓对象类型的情况下生成一个与
		// 其完全相同的复制品。
		List<Shape> shapes=new ArrayList<>();
		List<Shape> shapesCopy=new ArrayList<>();

		//创建一个圆圈
		Circle circle=new Circle();
		circle.x=10;
		circle.y=20;
		circle.radius=15;
		circle.color="red";

		Circle anotherCircle=(Circle) circle.clone();

		// 例如，我们不知晓形状数组中元素的具体类型，只知道它们都是形状。
		// 但在多态机制的帮助下，当我们在某个形状上调用 `clone（克隆）`
		// 方法时，程序会检查其所属的类并调用其中所定义的克隆方法。这样，
		// 我们将获得一个正确的复制品，而不是一组简单的形状对象。
		Rectangle rectangle=new Rectangle();
		rectangle.width=10;
		rectangle.height=20;
		rectangle.color="blue";

		shapes.add(circle);
		shapes.add(anotherCircle);
		shapes.add(rectangle);

		cloneAndCompare(shapes,shapesCopy);
	}


	private static  void  cloneAndCompare(List<Shape> shapes, final List<Shape> shapesCopy){
		shapes.forEach(shape->shapesCopy.add(shape.clone()));

		for (int i = 0; i < shapes.size(); i++) {
			if(shapes.get(i)!=shapesCopy.get(i)){
				System.out.println(i+"形状是不同的对象（耶！）");
				if(shapes.get(i).equals(shapesCopy.get(i))){
					System.out.println(i+" 它们是一样的（耶！）");
				}else{
					System.out.println(i + ":但它们并不完全相同（嘘！）");
				}
			}else{
				System.out.println(i+"形状对象相同（嘘！）");
			}
		}
	}

}
